home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / ebsx130 / eb.c < prev    next >
Text File  |  1997-05-06  |  34KB  |  1,475 lines

  1. /* EB.X V1.40d
  2.    1996.5.2 鈴木 健児 */
  3.  
  4. /* V1.00a : 環境変数 EB_FILE をデフォルトの検索ファイル名にする
  5.    1995.9.02 電脳魔術団 */
  6.  
  7. #include "common.h"
  8.  
  9. #include <stdlib.h>
  10. #include <iocslib.h>
  11. #include <jctype.h>
  12. /* #include <string.h> */
  13. #include <method/Dialog_i.h>
  14. #include <method/Event_i.h>
  15. #include <method/Dos_i.h>
  16. #include <method/Memory_i.h>
  17. #include <method/Task_i.h>
  18. #include <method/_methodSx.h>
  19. #include <method/sxutil.h>
  20.  
  21. /* プロトタイプ宣言 */
  22. /* kenji suzuki */
  23. int        CdFileOpen( char * , char * );
  24. int        set_gaiji( void );
  25. int        CdFileClose( void );
  26. int        Eb_Main( char * );
  27. int        conv_input( char * , char * , char * );
  28. jischar        *shift_jis( char * , jischar * , size_l );
  29. int        search_blockpos( void );
  30. unsigned int    search_index( unsigned int , jischar * );
  31. int        read_index( int , int * );
  32. int        search_komoku( jischar * , jischar * , char * , unsigned int * );
  33. int        skip_komoku( void );
  34. int        search_komoku2( jischar * , jischar * , char * , unsigned int * );
  35. int        printout( unsigned int , char * );
  36. int        printout2( int , unsigned int );
  37. void        InitTable( void );
  38. int        AddTable( char * , unsigned int );
  39. /* menu.cから */
  40. int        read_catalog( char * );
  41. int        get_path( char * , int , char * );
  42. int        get_title( char * , char *);
  43. int        read_catalogEP( char * );
  44. int        get_pathEP( char * , int , char * );
  45. int        get_titleEP( char * , char *);
  46. void        convJis( jischar * );
  47. int         AddTable2( char * , char * );
  48.  
  49. /* グローバル変数 */
  50. char        out[ 0x800*10 ];
  51. unsigned int    gindexpage , gindexoff;    /* kenji suzuki グラフィック用*/
  52. unsigned int    lindexpage , lindexoff; /* kenji suzuki 参照検索用*/
  53. unsigned int    mindexpage , mindexoff; /* kenji suzuki メニュー検索用*/
  54. int        alpha;
  55. int        linkflg;    /* kenji suzuki 0 = 参照検索していても無視する */
  56.  
  57. /* menu.cから */
  58. int        codetbl1[ 190 ];
  59. int        codetbl2[ 190 ];
  60. int        codetblebg[ 258 ];
  61.  
  62. int        menuposmax;    /* static ではない */
  63.  
  64. /* graphic.cから */
  65. int    glinkno;
  66.  
  67. /* QueryError用 */
  68. #define rectQE Rect(10, 30, 240, 160)
  69. int EventForQE( order_t );
  70.  
  71. extern window_t mainWin;
  72.  
  73. /* 変数、バッファ */
  74. char    *filepath = NULL;
  75. /* char    fn[ FILENAME_MAX ] = { "f:\\fsschro\\start" };
  76. */
  77. /* static    char    fn[ FILENAME_MAX ] = { 0 , }; */
  78.  
  79.  
  80. static    unsigned char    buffer[ 0x800+8 ];
  81. static    int        b_offset;
  82. static    int        lastpage;
  83.  
  84. char    a_key=0;
  85. static    char    n_key=0;
  86. char    t_key=0;
  87. char    r_key=0;
  88. static  char    g_key=0;    /* kenji suzuki 外字用 */
  89. static  char    i_key=0;    /* kenji suzuki グラフィック用 */
  90. static  char    l_key=0;    /* kenji suzuki 参照検索用 */
  91. char    e_key=0;    /* kenji suzuki EBG(英語版)用 */
  92. char    c_key=0;    /* kenji suzuki コマンドモード用 */
  93. static    char d1_key = 0;    /* debug */
  94. static    char d2_key = 0;    /* debug */
  95. char d3_key = 0;    /* debug */
  96. char    w_key = 0;    /* epwingタイプのCD-ROMなら1 */
  97. int    kouhocount;
  98. static    int    blocksuu;
  99.  
  100. unsigned int    pagenumber;
  101. static    unsigned int    k_rootpagenumber=0;    /* かなルートインデックス */
  102. static    unsigned int    k_r_rootpagenumber=0;    /* かな逆引きルートインデックス */
  103. static    unsigned int    a_rootpagenumber=0;    /* 英語ルートインデックス */
  104. static    unsigned int    a_r_rootpagenumber=0;    /* 英語逆引きルートインデックス */
  105. static    unsigned int    f1pagenumber=0;        /* 全角外字 */
  106. static    unsigned int    f2pagenumber=0;        /* 半角外字 */
  107. unsigned int    mpagenumber = 0;        /* メニューインデックス */
  108.  
  109. int    CdFileOpen( char *filename , char *oldfilename )
  110. {
  111.     int flg = 0;
  112.     int retcode;
  113.  
  114.     retcode = 0;
  115.     filepath = filename;
  116.  
  117.     if( cdfile > 0 )
  118.     {
  119.         flg = 1;
  120.         CdFileClose( );
  121.     };
  122.     cdfile = TSOpen( filepath , 0 );
  123.     if( cdfile < 0 )
  124.     {
  125. /*        ULError_str( "eb_sx.x:!! ファイルがオープンできません path=\n" ,filepath ); */
  126.         /* 元もと開いていたファイルを再度開く */
  127.         if( flg == 1 )
  128.         {
  129.             cdfile = TSOpen( oldfilename , 0 );
  130.         };
  131.         retcode = -1;
  132.     };
  133.  
  134.     search_blockpos();
  135.  
  136.     set_gaiji( );
  137.  
  138.     return( retcode );
  139. };
  140.  
  141. int    set_gaiji( void )
  142. {
  143.     int    code;
  144.     int    i;
  145.  
  146.     if( e_key == 0 )
  147.     {
  148.         code = 0xeb9f;
  149.         /* 半角外字の登録 */
  150.         /* 追加(95.10.03 M.Kamada) */
  151.         codetbl2[ 0 ] = 0xffff;
  152.         if( f2pagenumber != 0 && w_key == 0 )    /* w_keyについては暫定措置 */
  153.         {
  154.             code = set_gaiji2( code , f2pagenumber-1 );
  155.     /*  printf( "\ncode2 = %x\n" , code ); */
  156.         };
  157.  
  158.         /* 全角外字の登録 */
  159.         /* 追加(95.10.03 M.Kamada) */
  160.         codetbl1[ 0 ] = 0xffff;
  161.         if( f1pagenumber != 0 && w_key == 0 )    /* w_keyについては暫定措置 */
  162.         {
  163.             code = set_gaiji1( code , f1pagenumber-1 );
  164.     /* printf( "\ncode1 = %x\n" , code ); */
  165.         };
  166.     } else {
  167.         code = 0xeb9f;
  168.         /* 半角外字の登録 */
  169.         /* 追加(95.10.03 M.Kamada) */
  170.         codetbl2[ 0 ] = 0xffff;
  171.         if( f2pagenumber != 0 )
  172.         {
  173.             code = set_gaiji_ebg( code , f2pagenumber-1 );
  174.     /*  printf( "\ncode2 = %x\n" , code ); */
  175.         } else {
  176.             for( i=0; i<257; i++ )
  177.             {
  178.                 codetblebg[ i ] = 0xffff;
  179.             };
  180.         };
  181.     };
  182.  
  183.     return( 0 );
  184. }
  185.  
  186. int    CdFileClose( void )
  187. {
  188.     TSClose( cdfile );
  189.     bunkenFile = NULL;
  190.  
  191.     if( e_key == 0 )
  192.     {
  193.         if( w_key == 0 )
  194.         {
  195.             reset_gaiji();
  196.         };
  197.     } else {
  198.         reset_gaiji_ebg();
  199.     };
  200.  
  201.     k_rootpagenumber = 0;
  202.     k_r_rootpagenumber = 0;
  203.     a_rootpagenumber = 0;
  204.     a_r_rootpagenumber = 0;
  205.     f2pagenumber = 0;
  206.     f1pagenumber = 0;
  207.     mpagenumber = 0;
  208.  
  209.     kouhocount = 0;
  210.  
  211.     return( 0 );
  212. }
  213.  
  214. int Eb_Main( char *searchword )
  215. {
  216.     jischar        sei[ 258 ];
  217.     jischar        daku[ 258 ];
  218.     int        indextype;
  219.     int        stat;
  220.     int        count;
  221.     unsigned int    filepos;
  222.  
  223.     if( searchMode == 3 )
  224.     {
  225.         a_key = 1;
  226.     } else if( searchMode == 2 )
  227.     {
  228.         r_key = 1;
  229.         a_key = 0;
  230.     } else {
  231.         r_key = 0;
  232.         a_key = 0;
  233.     };
  234.  
  235.     stat = conv_input( searchword , sei , daku );
  236.     if( stat < 0 )
  237.     {
  238.         return( 0 );
  239.     };
  240.     stat = 1;
  241.     while( stat != 0 )
  242.     {
  243.         pagenumber = search_index( pagenumber , sei );
  244.         if( pagenumber == 0 )
  245.         {
  246.             return( 0 );            /* 入力文字が異常? */
  247.         };
  248.  
  249.         stat = read_index( 1 , &indextype );        /* stat != 0 ならルートインデックスがネスティングしている */
  250.     };
  251.  
  252.     if( d1_key == 1 )
  253.     {
  254.         return( 0 );
  255.     };
  256.  
  257.     t_key = 1;
  258.     InitTable();
  259.     kouhocount = 0;
  260.     stat = 0;
  261.     while( stat >= 0 )
  262.     {
  263. /*        init_menutbl( );
  264.         linkflg = 1;
  265.  
  266.         gindexpage = 0;
  267.         gindexoff = 0;
  268.         lindexpage = 0;
  269.         lindexoff = 0;
  270.         glinkno = 0;
  271. */
  272.         if( indextype == 1 )
  273.         {
  274.             stat = search_komoku( sei , daku , out , &filepos );
  275.         } else {
  276.             stat = search_komoku2( sei , daku , out , &filepos);
  277.         };
  278.         if( stat == 0 )
  279.         {
  280.             kouhocount++;
  281. /*            printout( filepos , out );
  282.             if( i_key == 1 && (( gindexpage != 0 ) || ( gindexoff != 0 )) )
  283.             {
  284.                 gindexpage = conv_hex( gindexpage );
  285.                 gindexoff = conv_hex( gindexoff );
  286.                 search_graphicindex( (gindexpage-1)*0x800+gindexoff );
  287.             };
  288.             if( l_key == 1 && menuposmax > 0 )
  289.             {
  290.                 linkflg = 0;
  291.                 count = 1;
  292.                 while( count <= menuposmax )
  293.                 {
  294.                     printout( menupostbl[ count-1 ] , out );
  295. */                    /* 参照した項目に画像があった場合 */
  296. /*                    if( i_key == 1 && (( gindexpage != 0 ) || ( gindexoff != 0 )) )
  297.                     {
  298.                         gindexpage = conv_hex( gindexpage );
  299.                         gindexoff = conv_hex( gindexoff );
  300.                         search_graphicindex( (gindexpage-1)*0x800+gindexoff );
  301.                     };
  302.                     count++;
  303.                 };
  304.             };
  305. */        };
  306.     };
  307.  
  308. /*    if (n_key) {
  309.         if (kouhocount>0)
  310.             printf("%d 個の候補があります\n",kouhocount);
  311.         else    puts("候補がありません");
  312.     } else {
  313.         if( kouhocount == 0 )
  314.         {
  315.             puts( "一致する項目はありません\n" );
  316.         };
  317.     };
  318. */
  319.     return( 0 );
  320. }
  321.  
  322. /* 入力文字を変換する */
  323. int    conv_input( char *searchword , char *sei , char *daku )
  324. {
  325.     char    *p;
  326.  
  327.     /* 清音JISに変換 */
  328.     if( e_key == 0 )
  329.     {
  330.         p = (char *)seion(searchword,sei,sizeof(sei));
  331.         if( p==NULL )
  332.         {
  333.             QueryError(1,  "この文字列は検索できません\0\0" , (proc_t) EventForQE, &mainWin, &rectQE);
  334.             return( -1 );
  335.         };
  336.  
  337.         /* ただ単にJISに変換 */
  338.         shift_jis( searchword , daku , sizeof(daku));
  339.     } else {
  340.         strcpy( daku , searchword );
  341.         strupr( daku );
  342.         strcpy( sei  , daku );
  343.     }
  344.  
  345.     if( alpha == 1 )
  346.     {
  347.         k_r_rootpagenumber = a_r_rootpagenumber;
  348.         k_rootpagenumber = a_rootpagenumber;
  349.     };
  350.     if( r_key )
  351.     {
  352.         if( e_key == 1 )
  353.         {
  354.             strrev( sei );
  355.             strrev( daku );
  356.         } else {
  357.             jismirror( sei );
  358.             jismirror( daku );
  359.         };
  360.         pagenumber = k_r_rootpagenumber;
  361.     } else {
  362.         pagenumber = k_rootpagenumber;
  363.     };
  364.  
  365. /*  printf( "input str = %s\n" , sei ); */
  366.     if( pagenumber == 0 )
  367.     {
  368.         QueryError(1,  "この文献には項目が登録されていません\0\0" , (proc_t) EventForQE, &mainWin, &rectQE);
  369.         return( -1 );
  370.     };
  371.  
  372.     return( 0 );
  373. }
  374.  
  375. /* SHIFT-JIS を JIS にする */
  376. jischar* shift_jis( char *str, jischar *outp, size_l length )
  377. {
  378.     unsigned char    c,fc;
  379.     int    ch;
  380.     char    *s=str;
  381.     jischar    *p=outp;
  382.     fc=0;
  383.     while (c=*s++) {
  384.         if ((ch=AKCONV(0,c))<0) {
  385.             if (iskanji(c)) {
  386.                 ch=c<<8;
  387.                 c=*s++;
  388.                 if (iskanji2(c)) {
  389.                     ch+=c;
  390.                 }
  391.             } else return NULL;
  392.         }
  393.         ch=SFTJIS(ch);
  394.         if ((ch&0xffe0)==0x2360) ch&=0x235f;  /* from seion.c 英小文字を大文字化 */
  395.         /* *p++=JISSFT(ch); */
  396.         *p++=ch;
  397.     }
  398.     *p++=0;
  399. /*    p=outp;
  400.     while (ch=*p++) {
  401.         ch=JISSFT(ch);
  402.         putchar(ch>>8); putchar(ch);
  403.         putchar('\n');
  404.     } */
  405.     return outp;
  406. }
  407.  
  408. int checkFile( char *arg )
  409. {
  410.     int l;
  411.     int i;
  412.     int delimit;
  413.     char *work;
  414.     int retcode;
  415.  
  416.     w_key = 0;
  417.  
  418.     work = arg;
  419.     l = strlen( work );
  420.     if( l == 0 )
  421.     {
  422.         return( 0 );
  423.     };
  424.  
  425.     retcode = 0;
  426.     i = 0;
  427.     delimit = 0;
  428.     while( i < l )
  429.     {
  430.         if( work[ i ] == '/' || work[ i ] == '\\' || work[ i ] == ':' )
  431.         {
  432.             delimit = i;
  433.         };
  434.         i++;
  435.     };
  436.     if( stricmp( work+delimit+1 , "catalog" ) == 0 )
  437.     {
  438.         retcode = 1;
  439.     } else if( stricmp( work+delimit+1 , "start" ) == 0 )
  440.     {
  441.         retcode = 2;
  442.     } else if( stricmp( work+delimit+1 , "catalogs" ) == 0 )
  443.     {
  444.         w_key = 1;
  445.         retcode = 3;
  446.     } else if( stricmp( work+delimit+1 , "honmon" ) == 0 )
  447.     {
  448.         w_key = 1;
  449.         retcode = 4;
  450.     };
  451.  
  452.     return( retcode );
  453. }
  454.  
  455. /* d100 がグラフィックデータ */
  456. /* 0f00 がそのインデックス */
  457. int    search_blockpos( void )
  458. {
  459.     unsigned short    saizu;
  460.     unsigned short    data;
  461.     int        i;
  462.  
  463.     DOSREAD( cdfile , &saizu , sizeof( unsigned short ) );    
  464.     DOSSEEK( cdfile , 16 , SEEK_SET );
  465.  
  466.     i = 0;
  467.     while( i < saizu )
  468.     {
  469.         DOSREAD( cdfile , &data , sizeof( unsigned short ) );    
  470. /* printf( "data =%x\n" , data ); */
  471.         if(( data & 0xff00 ) == 0x9000 )
  472.         {
  473.             DOSREAD( cdfile , &k_rootpagenumber , sizeof( unsigned int ) );
  474.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  475.             if( a_rootpagenumber == 0 )
  476.             {
  477.                 a_rootpagenumber = k_rootpagenumber;
  478.             };
  479.         }
  480.         else if(( data & 0xff00 ) == 0x9100 )
  481.         {
  482.             DOSREAD( cdfile , &a_rootpagenumber , sizeof( unsigned int ) );
  483.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  484.             if( k_rootpagenumber == 0 )
  485.             {
  486.                 k_rootpagenumber = a_rootpagenumber;
  487.             };
  488.         }
  489.         else if(( data & 0xff00 ) == 0x7000 )
  490.         {
  491.             DOSREAD( cdfile , &k_r_rootpagenumber , sizeof( unsigned int ) );
  492.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  493.             if( a_r_rootpagenumber == 0 )
  494.             {
  495.                 a_r_rootpagenumber = k_r_rootpagenumber;
  496.             };
  497.         }
  498.         else if(( data & 0xff00 ) == 0x7100 )
  499.         {
  500.             DOSREAD( cdfile , &a_r_rootpagenumber , sizeof( unsigned int ) );
  501.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  502.             if( k_r_rootpagenumber == 0 )
  503.             {
  504.                 k_r_rootpagenumber = a_r_rootpagenumber;
  505.             };
  506.         }
  507.         else if(( data & 0xff00 ) == 0xf200 )
  508.         {
  509.             DOSREAD( cdfile , &f2pagenumber , sizeof( unsigned int ) );
  510.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  511.         }
  512.         else if(( data & 0xff00 ) == 0xf100 )
  513.         {
  514.             DOSREAD( cdfile , &f1pagenumber , sizeof( unsigned int ) );
  515.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  516.         }
  517.         else if(( data & 0xff00 ) == 0x0100 )
  518.         {
  519.             DOSREAD( cdfile , &mpagenumber , sizeof( unsigned int ) );
  520.             DOSSEEK( cdfile , 10 , SEEK_CUR );
  521.         }
  522.         else
  523.         {
  524.             DOSSEEK( cdfile , 14 , SEEK_CUR );
  525.         };
  526.         i++;
  527.     };
  528.  
  529.     return( 0 );
  530. }
  531.  
  532. /* ルートインデックス内をサーチして、インデックスのページ番号を得る */
  533. unsigned int search_index( unsigned int rootpagenum , jischar *jc )
  534. {
  535.     int        i;
  536.     unsigned int    flg;
  537.     int        stat;
  538.     unsigned char    komoku[ 257 ];
  539.  
  540.     unsigned short    header;
  541.     unsigned short    saizu;
  542.     unsigned short    leng;
  543.     unsigned int    indexpagenum;
  544.  
  545.     DOSSEEK( cdfile , ( rootpagenum-1 )*0x800 , SEEK_SET );
  546.  
  547.     DOSREAD( cdfile , &header , sizeof( unsigned short ) );    
  548. /* printf( "page = %d , head = %x\n" , rootpagenum , header ); */
  549.     if( (header & 0xf000) > 0x6000 )
  550.     {
  551.         puts( "Error このページはルートインデックスではありません\n" );
  552.         return( 0 );
  553.     };
  554.     leng = ( header & 0x00ff );
  555.  
  556.     DOSREAD( cdfile , &saizu ,  sizeof( unsigned short ) );
  557.  
  558. /* printf( "head:%x , saizu:%d\n" , header , saizu ); */
  559.  
  560.     i = 0;
  561.     flg = 0;
  562.     while( (i < saizu) && (flg == 0) ) 
  563.     {
  564.         DOSREAD( cdfile , komoku , leng );
  565.         komoku[ leng ] = 0;
  566.         DOSREAD( cdfile , &indexpagenum , sizeof( unsigned int ) );
  567. /* printf( "no;%d -%32s %x-\n" , i , komoku , indexpagenum ); */
  568.  
  569.         stat = strncmp2( jc , komoku , leng );
  570.         if( stat == 0 )
  571.         {
  572.     if( d1_key )
  573.         printf( "このページ pagenum = %d\n" , indexpagenum );
  574.             flg = indexpagenum;
  575.         } else {
  576.             /* 入力文字の方が小さい */
  577.             if( stat < 0 )
  578.             {
  579.     if( d1_key )
  580.         printf( "このページ pagenum = %d\n" , indexpagenum );
  581.                 flg = indexpagenum;
  582.             };
  583.         };
  584.         i++;
  585.     };
  586.     if( flg == 0 )
  587.     {
  588.         puts( "Error インデックスが異常です\n" );
  589.     };
  590.     return( flg );
  591. }
  592.  
  593. /* インデックスを読み込む */
  594. int read_index( int flg , int *indextype )
  595. {
  596.     unsigned short    leng;
  597.  
  598.  /* printf( "page = %x\n" , pagenumber ); */
  599.  
  600.     DOSSEEK( cdfile , ( pagenumber-1 )*0x800  , SEEK_SET );
  601.     pagenumber++;
  602.     DOSREAD( cdfile , buffer , 0x800 );
  603.     buffer[ 0x800 ] = 0;        /* 終端記号 */
  604.     buffer[ 0x801 ] = 0;        /* 終端記号 */
  605.     buffer[ 0x802 ] = 0;        /* 終端記号 */
  606.     buffer[ 0x803 ] = 0;        /* 終端記号 */
  607.     b_offset = 0;
  608.  
  609.     /* 読み込んだページが、またルートインデックスだった(ネスティング) */
  610. /* printf( "head_b = %x\n" , buffer[ b_offset ]); */
  611.     if( buffer[ b_offset ] < 0x70 )
  612.     {
  613.         pagenumber--;
  614.         return( -1 );
  615.     };
  616.  
  617.   if( d1_key )
  618.   {
  619.     pagenumber--;
  620.     DOSSEEK( cdfile , ( pagenumber-1 )*0x800  , SEEK_SET );
  621.     return( 0 );
  622.   };
  623.  
  624.     /* インデックスのタイプの判定 */
  625.     if( (buffer[ b_offset ] & 0x10) == 0x10 )
  626.     {
  627.         /* 日本語 search_komoku  0xd000 0x9000 0xb000 */
  628.         *indextype = 1;
  629.     } else {
  630.         /* 英語他 search_komoku2 0xc000 0x8000 0xa000 */
  631.         *indextype = 0;
  632.     };
  633.  
  634.     /* これがインデックスの最後のページか? 0xb000 0xa000 */
  635.     if( (buffer[ b_offset ] & 0xe0) == 0xa0 )
  636.     {
  637.         lastpage = 1;
  638.     } else {
  639.         lastpage = 0;
  640.     };
  641.     b_offset += 4;
  642.  
  643.     /* 前のページから続いている部分をとばす 日本語の場合のみ*/
  644.     if( (flg == 1) && (*indextype == 1) )
  645.     {
  646.         leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  647.         while(( leng & 0xff00 ) == 0xc000 )
  648.         {
  649.             b_offset += (leng & 0x00ff)+14;
  650.             leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  651.         };
  652.     };
  653.     return( 0 );
  654. }
  655.  
  656.  
  657. /* 日本語版のインデックス内をサーチして、本文のページ番号を得る */
  658. /* 戻り値 = 0  入力文字列に該当する項目があった */
  659. /*        = -1 入力文字列より大きい項目に当たった = ループ終了 */
  660. /*        = 1  入力文字列より小さい項目に当たった = ループ続ける */
  661. int search_komoku( jischar *seion , jischar *nyuryoku , char *out , unsigned int *filepos )
  662. {
  663.     unsigned short leng;
  664.     unsigned short sleng;
  665.     int stat;
  666.     unsigned int   pagenum;
  667.     unsigned short offset;
  668.     int indextype;
  669.     /* 96.4.13 */
  670.     int retcode;
  671.     /* 96.5.13 */
  672.     int    statB;
  673.  
  674.     leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  675.     /* 次のページへ続く場合の処理 */
  676.     if( leng  == 0x0000 )    /* 「leng & 0xff00」を「leng」に変更 */
  677.     {
  678.         if( lastpage == 0 )
  679.         {
  680.             read_index( 0 , &indextype );    /* indextype はダミー */
  681.             leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  682.         } else {
  683.             return( -1 );
  684.         };
  685.     };
  686.     b_offset += 2;
  687.  
  688.     /* 95.11.16 追加 */
  689.     if( leng < 0x8000 )
  690.     {
  691.         blocksuu = 1;        /* 本当はブロックはないけど、1にする */
  692.  
  693.         /* 96.11.7 1ブロックの場合でも、清音、入力文字と2度比較する */
  694.         /* 清音と比較する処理 */
  695.         sleng = strlen( seion );
  696.     /*  printf( ":" );
  697.      printjis( &buffer[ b_offset ] );
  698.        printf( ":%x , %4x\n" , leng , sleng );
  699.     */    /* 入力文字より文字数が少ない場合は次の項目へスキップ
  700.            入力=あいうえ、buf=あい がヒットするのを防ぐため */
  701.         if(( leng & 0x00ff ) >= sleng )
  702.         {
  703.             stat = strncmp2( seion , &buffer[ b_offset ] , sleng );    /* 入力文字数文だけ比較 */
  704.             if( stat < 0 )
  705.             {
  706.                 return( -1 );
  707.             };
  708.             /* 完全一致検索の場合 文字数がちがう場合スキップ */
  709.             if( (a_key == 1) && ((leng & 0x00ff) != sleng) )
  710.             {
  711.                 b_offset -= 2;
  712.                 stat = skip_komoku( );
  713.                 return( stat );
  714.             };
  715.         } else {
  716.             if( seion[ 0 ] < ((buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]) )
  717.             {
  718.                 return( -1 );
  719.             } else {
  720.                 b_offset -= 2;
  721.                 stat = skip_komoku( );
  722.                 return( stat );
  723.             };
  724.         };
  725.     } else if( leng < 0xc000 )
  726.     {
  727.         blocksuu = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];    /* 0 なんてケースは無いはず */
  728.         b_offset += 2;
  729.  
  730.         /* 清音と比較する処理 */
  731.         sleng = strlen( seion );
  732.     /*  printf( ":" );
  733.      printjis( &buffer[ b_offset ] );
  734.        printf( ":%x , %4x\n" , leng , sleng );
  735.     */    /* 入力文字より文字数が少ない場合は次の項目へスキップ
  736.            入力=あいうえ、buf=あい がヒットするのを防ぐため */
  737.         if(( leng & 0x00ff ) >= sleng )
  738.         {
  739.             stat = strncmp2( seion , &buffer[ b_offset ] , sleng );    /* 入力文字数文だけ比較 */
  740.             if( stat < 0 )
  741.             {
  742.                 return( -1 );
  743.             };
  744.             /* 完全一致検索の場合 文字数がちがう場合スキップ */
  745.             if( (a_key == 1) && ((leng & 0x00ff) != sleng) )
  746.             {
  747.                 b_offset += ( leng & 0x00ff );
  748.                 stat = skip_komoku( );
  749.                 return( stat );
  750.             };
  751.         } else {
  752.             if( seion[ 0 ] < ((buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]) )
  753.             {
  754.                 return( -1 );
  755.             } else {
  756.                 b_offset += ( leng & 0x00ff );
  757.                 stat = skip_komoku( );
  758.                 return( stat );
  759.             };
  760.         };
  761.         b_offset += ( leng & 0x00ff );
  762.  
  763.         /* 次のページへ続く場合の処理 */
  764.         leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  765.         if( leng == 0x0000 )
  766.         {
  767.             if( lastpage == 0 )
  768.             {
  769.                 read_index( 0 , &indextype );    /* indextype はダミー */
  770.                 leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  771.             } else {
  772.                 return( -1 );
  773.             };
  774.         };
  775.         b_offset+=2;
  776.     };
  777.  
  778.     sleng = strlen( nyuryoku );
  779.     /* 入力文字より文字数が少ない場合は次の項目へスキップ
  780.        入力=あいうえ、buf=あい がヒットするのを防ぐため */
  781.     if(( leng & 0x00ff ) >= sleng )
  782.     {
  783.         /* 入力文字と比較する処理 */
  784.         stat = strncmp2( nyuryoku , &buffer[ b_offset ] , sleng );
  785.     /* printjis( &buffer[ b_offset ] );
  786.         printf( "  leng = %4x :%d %d\n" , leng , stat ,b_offset );
  787.     */
  788.     } else {
  789.         stat = 1;
  790.     };
  791.     b_offset += ( leng & 0x00ff );
  792.     pagenum = (buffer[ b_offset ] << 24) + (buffer[ b_offset+1 ] << 16) + (buffer[ b_offset+2 ] << 8) + buffer[ b_offset+3 ];
  793.     offset  = (buffer[ b_offset+4 ] << 8) + buffer[ b_offset+5 ];
  794.     b_offset += 12;
  795.     blocksuu--;
  796. /*  DMError( 1 , "つうか" ); */
  797.     /* 当たり 表示 */
  798.     /*  printf( "page = %x offset = %x\n" , pagenum , offset ); */
  799.     retcode = 1;
  800.     if( stat == 0 )
  801.     {
  802.         /* 完全一致検索の場合 文字数がちがえばスキップ */
  803.         if( a_key == 1 )
  804.         {
  805.     /*    printf( " 直前 %d %d " , leng , sleng ); */
  806.             if( (leng & 0x00ff) == sleng )
  807.             {
  808.                 *filepos = (pagenum-1) * 0x800 + offset;
  809.                 printout( *filepos , out );
  810.                 statB = AddTable( out , *filepos );
  811.                 if( statB == -1 )
  812.                 {
  813.                     /* 項目数が多すぎる or メモリが足りない */
  814.                     return( -1 );
  815.                 };
  816.                 retcode = 0;
  817.             };
  818.         } else {
  819.             *filepos = (pagenum-1) * 0x800 + offset;
  820.             printout( *filepos , out );
  821.             statB = AddTable( out , *filepos );
  822.             if( statB == -1 )
  823.             {
  824.                 /* 項目数が多すぎる or メモリが足りない */
  825.                 return( -1 );
  826.             };
  827.             retcode = 0;
  828.         };
  829.     } else if( stat < 0 )
  830.     {
  831.         /* ループを続けるため 1 にする */
  832.         if( leng < 0x8000 )
  833.         {
  834.             retcode = 1;
  835.         } else if( leng >= 0xc000 )
  836.         {
  837.             retcode = 1;
  838.         } else {
  839.             retcode = -1;
  840.         };
  841.     };
  842.  
  843. /*  printf( "\n" ); */
  844.     return( retcode );
  845. }
  846.  
  847. /* 次の項目の頭までスキップする */
  848. int    skip_komoku( void )
  849. {
  850.     unsigned short    leng;
  851.     int        indextype;
  852.  
  853.     while(  blocksuu > 0 )
  854.     {
  855.         /* 次のページへ続く場合の処理 */
  856.         leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  857.         if( leng == 0x0000 )
  858.         {
  859.             if( lastpage == 0 )
  860.             {
  861.                 read_index( 0 , &indextype );    /* indextype はダミー */
  862.                 leng = (buffer[ b_offset ] << 8) + buffer[ b_offset+1 ];
  863.             } else {
  864.                 return( -1 );    /* ループ終わり */
  865.             };
  866.         };
  867.         b_offset += 2 + ( leng & 0x00ff ) + 12;        /* leng + 文字列 + ポインタ */
  868.         blocksuu--;
  869.     };
  870.  
  871.     return( 1 );    /* ループ続ける */
  872. }
  873.  
  874. /* 英語他のインデックス */
  875. /* 戻り値 = 0  入力文字列に該当する項目があった */
  876. /*        = -1 入力文字列より大きい項目に当たった = ループ終了 */
  877. /*        = 1  入力文字列より小さい項目に当たった = ループ続ける */
  878. int search_komoku2( jischar *seion , jischar *nyuryoku , char *out , unsigned int *filepos )
  879. {
  880.     unsigned char    leng;
  881.     int        indextype;
  882.  
  883.     int        i;
  884.     unsigned char    sleng;
  885.     int        stat;
  886.     unsigned int    pagenum;
  887.     unsigned short    offset;
  888.     /* 96.4.13 */
  889.     int        retcode;
  890.     int        skip;
  891.     char        *ptr;
  892.     int        statB;
  893.  
  894.     retcode = 1;
  895.     leng = buffer[ b_offset ];
  896.     /* ページをまたがる場合の処理 */
  897.     if( leng == 0x00 )
  898.     {
  899.         if( lastpage == 0 )
  900.         {
  901.             read_index( 0 , &indextype );    /* indextype はダミー */
  902.             leng = buffer[ b_offset ];
  903.         } else {
  904.             return( -1 );
  905.         };
  906.     };
  907.     b_offset++;
  908.  
  909.     /* 入力文字と比較する処理 */
  910.     sleng = strlen( nyuryoku );
  911.     /*  bufの項目が「file 」(スペースで終わる)の場合、「file」として比較する
  912.         完全一致検索で、入力「file」、buf「file 」をヒットさせるため
  913.         ただし、入力文字列の最後がスペースの場合「file 」は、除く */
  914.     /*  入力        buf
  915.        「file」  , 「file」  そのまま比較
  916.        「file」  , 「file 」 この場合のみ、buf「file」として比較する
  917.        「file 」 , 「file」 そのまま比較
  918.        「file 」 , 「file 」 そのまま比較 */
  919.     if( buffer[ b_offset + leng-1 ] == 0x20 )        /* bufの最後は0x20か? */
  920.     {
  921.         ptr = nyuryoku;
  922.         if( ptr[ sleng-1 ] == 0x20 )    /* 入力の最後も0x20か? */
  923.         {
  924.             skip = 0;
  925.         } else {
  926.             leng--;
  927.             skip = 1;
  928.         };
  929.     } else {
  930.         skip = 0;
  931.     };
  932. /* printf( ":%s:%4x , :" , &buffer[ b_offset ] , leng );
  933.  printjis( nyuryoku );
  934.  printf( ":%s:%4x ,%d\n" , nyuryoku , sleng , skip );
  935. */    /* 入力文字より文字数が少ない場合は次の項目へスキップ
  936.        入力=あいうえ、buf=あい がヒットするのを防ぐため */
  937.     if( leng >= sleng )
  938.     {
  939.         stat = strncmp2( nyuryoku , &buffer[ b_offset ] , sleng );    /* 入力文字数文だけ比較 */
  940.         if( stat < 0 )
  941.         {
  942.             return( -1 );
  943.         };
  944.         /* 完全一致検索の場合 文字数がちがう場合スキップ */
  945.         if( (a_key == 1) && (leng != sleng) )
  946.         {
  947.             stat = -1;
  948.         };
  949.     } else {
  950.         if( nyuryoku[ 0 ] < ((buffer[ b_offset ] << 8) + buffer[ b_offset+1 ]) )
  951.         {
  952.             return( -1 );
  953.         } else {
  954.             stat = -1;
  955.         };
  956.     };
  957.     b_offset = b_offset + leng + skip;
  958.  
  959.     pagenum = (buffer[ b_offset ] << 24) + (buffer[ b_offset+1 ] << 16) + (buffer[ b_offset+2 ] << 8) + buffer[ b_offset+3 ];
  960.     offset  = (buffer[ b_offset+4 ] << 8) + buffer[ b_offset+5 ];
  961.     b_offset += 12;
  962.     i++;
  963.     /* 当たり 表示 */
  964. /* printf( "page = %x offset = %x\n" , pagen , offsetn ); */
  965.     if( stat == 0 )
  966.     {
  967.         /* 完全一致検索の場合 文字数がちがえばスキップ */
  968.         if( a_key == 1 )
  969.         {
  970.             if( leng == sleng )
  971.             {
  972.                 *filepos = (pagenum-1) * 0x800 + offset;
  973.                 printout( *filepos , out );
  974.                 statB = AddTable( out , *filepos );
  975.                 if( statB == -1 )
  976.                 {
  977.                     /* 項目数が多すぎる or メモリが足りない */
  978.                     return( -1 );
  979.                 };
  980.                 retcode = 0;
  981.             };
  982.         } else {
  983.             *filepos = (pagenum-1) * 0x800 + offset;
  984.             printout( *filepos , out );
  985.             statB = AddTable( out , *filepos );
  986.             if( statB == -1 )
  987.             {
  988.                 /* 項目数が多すぎる or メモリが足りない */
  989.                 return( -1 );
  990.             };
  991.             retcode = 0;
  992.         };
  993.     };
  994.     /* leng を元に戻す */
  995. /*    if( skip == 1 )
  996.     {
  997.         leng++;
  998.     }; */
  999. /* printf( "\n" ); */
  1000.     return( retcode );
  1001. }
  1002.  
  1003.  
  1004. int printout( unsigned int filepos , char *out )
  1005. {
  1006.     int steps;
  1007.     int nextflg; /* この関数では関係ない */
  1008.  
  1009.     if( n_key == 0 )
  1010.     {
  1011. /*    printf( "filepos = %x\n" , filepos ); */
  1012.         DOSSEEK( cdfile , filepos , SEEK_SET );
  1013.         if( d3_key == 0 )
  1014.         {
  1015.             steps = jis2shift( out , 0x800*4 , t_key , &nextflg );
  1016. /*    DMError( 1,out ); */
  1017. /*            puts( out );
  1018.         } else {
  1019.             printdump( );
  1020. */        };
  1021.     };
  1022.  
  1023.     return( 0 );
  1024. };
  1025.  
  1026. int printout2( int line , unsigned int filepos )
  1027. {
  1028.     static    char    fockname[] = "eb_hon.x";
  1029. /*                          012345678901234567890123456 */
  1030.     static    char    comline[180];
  1031.     static    char    work[ 60 ];
  1032.     char    *workptr;
  1033.     int    stat;
  1034.  
  1035.     /* コマンドラインの作成 */
  1036.     strcpy( comline , " -t" );
  1037.     workptr = work;
  1038.     ULUsingX( workptr, (int)filepos , 8 );
  1039.     while( *workptr == ' ' && *workptr != 0 )    /* 頭のスペースをとばす */
  1040.         workptr++;
  1041.     strcat( comline, workptr );
  1042.  
  1043.     strcat( comline , " -f" );
  1044.     strcat( comline , bunkenFile );
  1045.  
  1046.     if( e_key == 1 )
  1047.     {
  1048.         strcat( comline , " -e" );
  1049.     };
  1050.  
  1051.     strcat( comline , " -g" );
  1052.     workptr = work;
  1053.     ULUsingX( workptr, limit , 8 );
  1054.     while( *workptr == ' ' && *workptr != 0 )    /* 頭のスペースをとばす */
  1055.         workptr++;
  1056.     strcat( comline, workptr );
  1057.  
  1058.     *comline = strlen( comline+1 );
  1059.     stat = TSFockB( 0,fockname , comline , 0,fockname ); 
  1060.     return( stat );
  1061. };
  1062.  
  1063. /* 本文表示タスクをすべて終了させる */
  1064. int TskAllClose( void )
  1065. {
  1066.     tsevent    eventRec;
  1067.     int    ret;
  1068.     short    tskid,maxtskid;
  1069.     long    stat;
  1070.  
  1071.     eventRec.when   = EMSysTime();
  1072.     eventRec.what2  = ENDTSK;
  1073.  
  1074.     tskid = 1;
  1075.     while( tskid > 0 )
  1076.     {
  1077.         stat = TSFindTskn( "eb_hon.x" , (int)tskid );
  1078.         tskid = stat & 0xffff;
  1079.         if( tskid > 0 )
  1080.         {
  1081.             ret = TSSendMes( (int)tskid , &eventRec);
  1082.         };
  1083.     };
  1084.  
  1085.     return( 0 );
  1086. }
  1087.  
  1088. void InitTable( void )
  1089. {
  1090.     while (--tableMax >= 0) {
  1091.         if( tablePostNo[tableMax] != NULL)
  1092.         {
  1093.             _ULFREE(tablePostNo[tableMax]);
  1094.             tablePostNo[tableMax] = NULL;
  1095.             tableFilePos[ tableMax ] = 0;
  1096.         };
  1097.     }
  1098.     tableMax = 0;
  1099. }
  1100.  
  1101. int AddTable( char *cnt , unsigned int filepos )
  1102. {
  1103.     int count = 0;
  1104.     char *d, *s;
  1105.     if (tableMax >= MAX_TABLE_POST_NO )
  1106.         return -1;   /* MAX_TABLE_POST_NO 個以上なんてあったら そりゃ郵政省が悪い */
  1107.     if ((d = tablePostNo[tableMax] = _ULMALLOC(strlen(cnt) + 10)) == NULL) {
  1108.         QueryError(1,"メモリが足りません\0\0", (proc_t) EventForQE, &mainWin, &rectQE);
  1109.         return -1;
  1110.     }
  1111.     /* 32以上だと、項目の0文字目を1バイト開けなければならない
  1112.      * 表Methodの仕様 */
  1113.     *d = 0;
  1114.     d += (tableMax < 32 ? 0:1);
  1115.  
  1116.     /* 項目をコピー */
  1117.     strcpy( d,cnt);
  1118.     tableFilePos[ tableMax ] = filepos;
  1119.     tableMax++;
  1120.     return 0;
  1121. }
  1122.  
  1123. /* EB/EBG/EBXA用 */
  1124. /* tablePostNo[] , tableMax の値が変わるので注意 */
  1125. /* CATALOGファイルを読み込む */
  1126. int    read_catalog( char *path )
  1127. {
  1128.     int        catalog = 0;
  1129.     int        i;
  1130.     unsigned char    komokuz[ 34 ];
  1131.     unsigned char    komokuh[ 10 ];
  1132.     unsigned short    saizu;
  1133.     unsigned short    dummy;
  1134.  
  1135.     if( oprateMode > 1 )
  1136.     {
  1137.         CdFileClose( );
  1138.     };
  1139.     InitTable();
  1140.  
  1141.     catalog = TSOpen( path , 0 );
  1142.     if( catalog  < 0 )
  1143.     {
  1144.         return( -1 );
  1145.     };
  1146.     DOSREAD( catalog , &saizu ,  sizeof( unsigned short ) );
  1147.     DOSSEEK( catalog , 14 , SEEK_CUR );
  1148.  
  1149.     i = 0;
  1150.     while( i < saizu )
  1151.     {
  1152.         DOSREAD( catalog , &dummy ,  sizeof( unsigned short ) );
  1153.         DOSREAD( catalog , komokuz , 30 );    /* 全角(文献の名前) */
  1154.         komokuz[ 30 ] = 0;
  1155.         komokuz[ 31 ] = 0;            /* printjis() では2バイト単位で処理するので 0 も2バイト分書き込まないといけない */
  1156.         DOSREAD( catalog , komokuh, 8 );    /* 半角(ディレクトリ名) */
  1157.         komokuh[ 8 ] = 0;
  1158.  
  1159.         if( e_key == 0 )
  1160.         {
  1161.             convJis( (jischar *)komokuz );        /* SJISに変換する */
  1162.         };
  1163.         AddTable2( komokuz , komokuh );        /* 後ろの引数2つはダミー(0 , 0のこと) */
  1164.         i++;
  1165.     };
  1166.  
  1167.     TSClose( catalog );
  1168.     return( 0 );
  1169. }
  1170.  
  1171. /* CATALOGファイル中のパス名の部分を得る */
  1172. /*
  1173.   in  path CATALOGファイルのパス
  1174.       num  番号
  1175.   out path2 STARTファイルへのパス(最大8文字だけど、10文字分確保すること)
  1176. */
  1177. int    get_path( char *path , int num , char *path2 )
  1178. {
  1179.     int        catalog = 0;
  1180.  
  1181.     catalog = TSOpen( path , 0 );
  1182.     if( catalog < 0 )
  1183.     {
  1184.         return( -1 );
  1185.     };
  1186.  
  1187.     DOSSEEK( catalog , 16 , SEEK_CUR );
  1188.     if( num > 1 )
  1189.     {
  1190.         DOSSEEK( catalog , 40*( num-1 ) , SEEK_CUR );
  1191.     };
  1192.     DOSSEEK( catalog , 32 , SEEK_CUR );
  1193.     DOSREAD( catalog , path2 , 8 );        /* 半角(ディレクトリ名) */
  1194.     path2[ 8 ] = 0;
  1195.  
  1196.     TSClose( catalog );
  1197.     return( 0 );
  1198. }
  1199.  
  1200. /* STARTファイルの文献名を得る */
  1201. /*
  1202.   in  path STARTファイルのパス
  1203.   out title STARTファイルの文献名(最大8文字だけど、10文字分確保すること)
  1204. */
  1205. int    get_title( char *path , char *title )
  1206. {
  1207.     int    i;
  1208.     unsigned short saizu;
  1209.     int    catalog = 0;
  1210.     char    cpath[ 258 ];
  1211.     char    work[ 258 ];
  1212.     char    path2[10];
  1213.     char    *pwork;
  1214.     int    retcode;
  1215.  
  1216.     retcode = -1;
  1217.  
  1218.     /* CATALOGファイルのパスを作る */
  1219.     strncpy( cpath , path , 2 );
  1220.     cpath[ 2 ] = '\0';
  1221.     strcat( cpath , "\\catalog" );
  1222.  
  1223.     /* パス名を取り出す */
  1224.     pwork = ULPathOf( work , path );
  1225.     *pwork = '\0';
  1226.  
  1227.     catalog = TSOpen( cpath , 0 );
  1228.     if( catalog < 0 )
  1229.     {
  1230. /*        ULError_str( "eb_sx.x:!! ファイルがオープンできません path=\n" ,cpath ); */
  1231.         return( -1 );    /* CATALOGファイルが見つからなかった */
  1232.     };
  1233.  
  1234.     DOSREAD( catalog , &saizu ,  sizeof( unsigned short ) );
  1235.     DOSSEEK( catalog , 14 , SEEK_CUR );
  1236.  
  1237.     i = 0;
  1238.     while( i < saizu )
  1239.     {
  1240.         DOSSEEK( catalog , 2 , SEEK_CUR );
  1241.         DOSREAD( catalog , title , 30 );
  1242.         title[ 30 ] = 0;
  1243.         DOSREAD( catalog , path2 , 8 );        /* 半角(ディレクトリ名) */
  1244.         path2[ 8 ] = 0;
  1245.         if( stricmp( work+3 , path2 ) == 0 )
  1246.         {
  1247.             i = saizu;    /* ループ終わり */
  1248.             retcode = 0;
  1249.         } else {
  1250.             title[ 0 ] = '\0';
  1251.         };
  1252.         i++;
  1253.     };
  1254.  
  1255.     TSClose( catalog );
  1256.     return( retcode );
  1257. }
  1258.  
  1259. /* EPWING用 */
  1260. /* tablePostNo[] , tableMax の値が変わるので注意 */
  1261. /* CATALOGSファイルを読み込む */
  1262. int    read_catalogEP( char *path )
  1263. {
  1264.     int        catalog = 0;
  1265.     int        i;
  1266.     unsigned char    komokuz[ 34 ];
  1267.     unsigned char    komokuh[ 10 ];
  1268.     unsigned short    saizu;
  1269.     unsigned short    dummy;
  1270.  
  1271.     if( oprateMode > 1 )
  1272.     {
  1273.         TSClose( cdfile );
  1274.     };
  1275.     InitTable();
  1276.  
  1277.     catalog = TSOpen( path , 0 );
  1278.     if( catalog  < 0 )
  1279.     {
  1280.         return( -1 );
  1281.     };
  1282.     DOSREAD( catalog , &saizu ,  sizeof( unsigned short ) );
  1283.     DOSSEEK( catalog , 14 , SEEK_CUR );
  1284.  
  1285.     i = 0;
  1286.     while( i < saizu )
  1287.     {
  1288.         DOSREAD( catalog , &dummy ,  sizeof( unsigned short ) );
  1289.         DOSREAD( catalog , komokuz , 30 );    /* 全角(文献の名前) */
  1290.         komokuz[ 30 ] = 0;
  1291.         komokuz[ 31 ] = 0;            /* printjis() では2バイト単位で処理するので 0 も2バイト分書き込まないといけない */
  1292.  
  1293.         DOSSEEK( catalog , 48 , SEEK_CUR );
  1294.         DOSREAD( catalog , &dummy ,  sizeof( unsigned short ) );
  1295.  
  1296.         DOSREAD( catalog , komokuh, 8 );    /* 半角(ディレクトリ名) */
  1297.         komokuh[ 8 ] = 0;
  1298.  
  1299.         DOSSEEK( catalog , 74 , SEEK_CUR );
  1300.  
  1301.         if( e_key == 0 )
  1302.         {
  1303.             convJis( (jischar *)komokuz );        /* SJISに変換する */
  1304.         };
  1305.  
  1306.         AddTable2( komokuz , komokuh );        /* 後ろの引数2つはダミー(0 , 0のこと) */
  1307.         i++;
  1308.     };
  1309.  
  1310.     TSClose( catalog );
  1311.     return( 0 );
  1312. }
  1313.  
  1314. /* CATALOGファイル中のパス名の部分を得る */
  1315. /*
  1316.   in  path CATALOGファイルのパス
  1317.       num  番号
  1318.   out path2 STARTファイルへのパス(最大8文字だけど、10文字分確保すること)
  1319. */
  1320. int    get_pathEP( char *path , int num , char *path2 )
  1321. {
  1322.     int    catalog = 0;
  1323.     char    *work;
  1324.  
  1325.     catalog = TSOpen( path , 0 );
  1326.     if( catalog < 0 )
  1327.     {
  1328.         return( -1 );
  1329.     };
  1330.  
  1331.     DOSSEEK( catalog , 16 , SEEK_CUR );
  1332.     if( num > 1 )
  1333.     {
  1334.         DOSSEEK( catalog , 164*( num-1 ) , SEEK_CUR );
  1335.     };
  1336.     DOSSEEK( catalog , 82 , SEEK_CUR );
  1337.     DOSREAD( catalog , path2 , 8 );        /* 半角(ディレクトリ名) */
  1338.     path2[ 8 ] = 0;
  1339.  
  1340.     /* "dir     " -> "dir" */
  1341.     work = path2+7;
  1342.     while( *work == 0x20 )
  1343.     {
  1344.         work--;
  1345.     };
  1346.     work++;
  1347.     *work = 0;
  1348.  
  1349.     TSClose( catalog );
  1350.     return( 0 );
  1351. }
  1352.  
  1353. /* STARTファイルの文献名を得る */
  1354. /*
  1355.   in  path STARTファイルのパス
  1356.   out title STARTファイルの文献名(最大8文字だけど、10文字分確保すること)
  1357. */
  1358. int    get_titleEP( char *path , char *title )
  1359. {
  1360.     int    i;
  1361.     unsigned short saizu;
  1362.     int    catalog = 0;
  1363.     char    cpath[ 258 ];
  1364.     char    work[ 258 ];
  1365.     char    path2[10];
  1366.     char    *pwork;
  1367.     int    retcode;
  1368.  
  1369.     retcode = -1;
  1370.  
  1371.     /* CATALOGファイルのパスを作る */
  1372.     strncpy( cpath , path , 2 );
  1373.     cpath[ 2 ] = '\0';
  1374.     strcat( cpath , "\\catalogs" );
  1375.  
  1376.     /* パス名を取り出す */
  1377.     strcpy( work , path+3 );
  1378.     /* "koujien\data\honmon" -> "koujien" */
  1379.     pwork = work;
  1380.     while( *pwork != '\\' )
  1381.     {
  1382.         pwork++;
  1383.     };
  1384.     *pwork = 0;
  1385.  
  1386.     catalog = TSOpen( cpath , 0 );
  1387.     if( catalog < 0 )
  1388.     {
  1389. /*        ULError_str( "eb_sx.x:!! ファイルがオープンできません path=\n" ,cpath );    */
  1390.         return( -1 );    /* CATALOGファイルが見つからなかった */
  1391.     };
  1392.  
  1393.     DOSREAD( catalog , &saizu ,  sizeof( unsigned short ) );
  1394.     DOSSEEK( catalog , 14 , SEEK_CUR );
  1395.  
  1396.     i = 0;
  1397.     while( i < saizu )
  1398.     {
  1399.         DOSSEEK( catalog , 2 , SEEK_CUR );
  1400.         DOSREAD( catalog , title , 30 );
  1401.         title[ 30 ] = 0;
  1402.  
  1403.         DOSSEEK( catalog , 48 , SEEK_CUR );
  1404.         DOSSEEK( catalog , 2 , SEEK_CUR );
  1405.  
  1406.         DOSREAD( catalog , path2 , 8 );        /* 半角(ディレクトリ名) */
  1407.         path2[ 8 ] = 0;
  1408.  
  1409.         /* "dir     " -> "dir" */
  1410.         pwork = path2+7;
  1411.         while( *pwork == 0x20 )
  1412.         {
  1413.             pwork--;
  1414.         };
  1415.         pwork++;
  1416.         *pwork = 0;
  1417.  
  1418.         if( stricmp( work , path2 ) == 0 )
  1419.         {
  1420.             i = saizu;    /* ループ終わり */
  1421.             retcode = 0;
  1422.         } else {
  1423.             title[ 0 ] = '\0';
  1424.         };
  1425.  
  1426.         DOSSEEK( catalog , 74 , SEEK_CUR );
  1427.         i++;
  1428.     };
  1429.  
  1430.     TSClose( catalog );
  1431.     return( retcode );
  1432. }
  1433.  
  1434.  
  1435. void convJis( jischar *komoku )
  1436. {
  1437.     int sjis;
  1438.     int i;
  1439.  
  1440.     i = 0;
  1441.     while( komoku[ i ] != 0 ) 
  1442.     {
  1443.         sjis = JISSFT( komoku[ i ] );
  1444.         komoku[ i ] = (jischar)sjis;
  1445.         i++;
  1446.     };
  1447. }
  1448.  
  1449.  
  1450. int AddTable2( char *zen , char *han )
  1451. {
  1452.     int count = 0;
  1453.     char *dz, *dh, *s;
  1454.     if (tableMax >= MAX_TABLE_POST_NO )
  1455.         return -1;   /* MAX_TABLE_POST_NO 個以上なんてあったら そりゃ郵政省が悪い */
  1456.     if ((dz = tablePostNo[tableMax] = _ULMALLOC(strlen(zen) + 10)) == NULL) {
  1457.         QueryError(1, "メモリが足りません\0\0" , (proc_t) EventForQE, &mainWin, &rectQE);
  1458.         return -1;
  1459.     }
  1460.  
  1461.     /* 32以上だと、項目の0文字目を1バイト開けなければならない
  1462.      * 表Methodの仕様 */
  1463.     *dz = 0;
  1464.     dz += (tableMax < 32 ? 0:1);
  1465.  
  1466.     /* 項目をコピー */
  1467.     strcpy( dz,zen);
  1468. /*    strcpy( dh,han); */
  1469.     tableFilePos[ tableMax ] = NULL;
  1470.     tableMax++;
  1471.     return 0;
  1472. }
  1473.  
  1474. /* end */
  1475.